Javaでローカルの変数名を取得する


概要

Javaのプログラム中、

String a = なにやら;
log(a.name()+"="+a);


と書いて、

関数logから出力されるのが、


a:なにやら

とかなると、後から追うときちょっと楽かなと思った。

具体的には、記述として


String val1 = "val1Value";
String val2 = "val2Value";
System.out.println("val1="+ val1+"val2"+ val2);


ってのが

String val1 = "val1Value";
String val2 = "val2Value";
System.out.println(val1.name()+"="+ val1+val2.name()+"="+ val2);


になる。

特にリファクタリングが楽そう

もちろんStringクラスにフィールド名吐くnameメソッドなど無い。

(C#だとnameプロパティ有るけどねwww って教えてくれたobhrありがとう。ムカつく。)



方法's

コンパイラにオプション渡してそれっぽい情報がclassに乗るようにする+リフレクション

@tan_go238さん、@backpaper0 さん、@kimukou2628さん、@kurobaraさん、より

不明.pngbackpaper0 @tan_go238 @toru_inoue -gか-g:varsつけてjavacしないとローカル変数名や引数名って消えちゃう気が。フィールド名は普通に取れるけど。12/06/17 17:31



Javassistを使う

@masanobuimai さんより

1__#$!@%!#__不明.png

masanobuimai

@toru_inoue javassist使うとできるみたいですよ。http://t.co/lt4GcxGx

12/06/17 17:48



Paranamerを使う

@esmasui さんより。

1__#$!@%!#__1__#$!@%!#__不明.png

esmasui

@toru_inoue  paranamer使うといいと思いますの

12/06/17 18:14


これか。

http://paranamer.codehaus.org/

使用例は

http://d.hatena.ne.jp/Kazzz/20100222/p1



感想:Twitterすごい。

今回は用途が[できなくてはいけない]というレベルではないため、さすがにJavasstとかは

つかえないが、、

勉強になった。

で、



ここからうらがみさん無双

2__#$!@%!#__不明.png

backpaper0

@tan_go238 @toru_inoue やっとできたhttps://t.co/VOT8i5og

12/06/17 18:26


ふえー。できるもんなんだ、、 うらがみさんすげー、、!


手元で確認した範囲だと、


attr.getConstPool().getUtf8Info(attr.nameIndex(1));


はnameIndex(0)でthis, 1でaを返してくる。


言語仕様的に、採番は定義順っぽいんだけど(自分が、それ以外の方法でJVMが値マッピングの方法をとっている、という部分を見つけられなかったため確証は無い)


どうしても心配なら、順は保証されてないことにして、値の集合として扱えばいいと思う。

そういうふうにClassから切れば、つかえる。


1宣言のために1クラスだととっても効率悪いけど、1集合とかなら行けそう。



突然の話題に返答ありがとう!

重ねてお礼申し上げます。


神様、見てたらうらがみさんに日曜日をもう一日。